package com.smasher.core.encrypt.encode;


import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Base64 工具类
 */
public class Base64Util {

    public static final String TAG = "Base64";

    /**
     * Base64编码
     *
     * @param string 编码字符串
     * @return 编码结果字符串
     */
    public static String base64EncodeStr(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        return Base64.encodeToString(string.getBytes(), Base64.DEFAULT);
    }

    /**
     * Base64解码
     *
     * @param string 解码字符串
     * @return 解码结果字符串
     */
    public static String base64DecodedStr(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        return new String(Base64.decode(string, Base64.DEFAULT));
    }

    /**
     * Base64编码
     *
     * @param file 编码文件
     * @return 编码结果字符串
     */
    public static String base64EncodeFile(File file) {
        if (file == null || !file.isFile() || !file.exists()) {
            return "";
        }

        try (FileInputStream inputFile = new FileInputStream(file)) {
            byte[] buffer = new byte[8192]; // 8KB buffer
            int bytesRead;
            StringBuilder encodedStringBuilder = new StringBuilder();

            while ((bytesRead = inputFile.read(buffer)) != -1) {
                // 对每次读取的数据进行 Base64 编码并追加到结果字符串中
                byte[] dataChunk = new byte[bytesRead];
                System.arraycopy(buffer, 0, dataChunk, 0, bytesRead);
                encodedStringBuilder.append(Base64.encodeToString(dataChunk, Base64.DEFAULT));
            }

            return encodedStringBuilder.toString();
        } catch (IOException e) {
            // 记录日志或抛出自定义异常
            Log.e(TAG, "base64EncodeFile: ", e);
            return ""; // 或者抛出异常
        }
    }

    /**
     * Base64解码
     *
     * @param filePath 解码文件路径
     * @param code     解码文件编码
     * @return 解码结果文件
     */
    public static File base64DecodedFile(String filePath, String code) {
        // 验证输入参数
        if (TextUtils.isEmpty(filePath) || TextUtils.isEmpty(code)) {
            throw new IllegalArgumentException("File path and code must not be empty.");
        }

        File desFile = new File(filePath);
        try (FileOutputStream fos = new FileOutputStream(desFile)) {
            // 解码 Base64 字符串
            byte[] decodeBytes = Base64.decode(code, Base64.DEFAULT);
            // 写入文件
            fos.write(decodeBytes);
            fos.flush(); // 确保所有数据都被写入文件
            return desFile;
        } catch (IllegalArgumentException e) {
            // 捕获非法 Base64 编码的情况
            Log.e(TAG, "base64DecodedFile: ", e);
            throw new IllegalArgumentException("Invalid Base64 encoding: " + e.getMessage(), e);
        } catch (IOException e) {
            // 捕获 I/O 相关的异常
            Log.e(TAG, "base64DecodedFile: ", e);
            throw new RuntimeException("Failed to write file: " + e.getMessage(), e);
        }
    }
}
